/*
** $ 身份：嘞串.h $
** 字符串表（保留由炉啊处理的所有字符串）
** 请参见炉啊.h中的版权声明
*/

#ifndef 嘞串_喝
#define 嘞串_喝

#include "嘞垃圾收集.h"
#include "嘞对象.h"
#include "嘞国.h"

/*
** 必须预先分配内存分配错误消息（它不能
** 在内存耗尽后创建）
*/
#define 内存错消息       "内存不足"

/*
** 嚏串 的大小: 标头的大小加上字符串的空间
** 本身（包括最终的 '\0' ）。
*/
#define 大小嘞串(嘞)  (offsetof(嚏串, 内容) + ((嘞) + 1) * sizeof(char))

#define 炉啊丝_新字面值(嘞, 丝)	(炉啊丝_新嘞串(嘞, "" 丝, \
                                 (sizeof(丝)/sizeof(char))-1))

/*
** 测试串是否为保留字
*/
#define 是否保留(丝)	((丝)->嚏嚏 == 炉啊_微短串 && (丝)->额外 > 0)

/*
** 等于短串，始终内部化
*/
#define 相等短串(啊,哔)	检查_表达式((啊)->嚏嚏 == 炉啊_微短串, (啊) == (哔))

炉啊艾_函 unsigned int 炉啊丝_哈希 (const char *串, size_t 嘞,
                                  unsigned int 种子, size_t 步进);

炉啊艾_函 unsigned int 炉啊丝_哈希长串 (嚏串 *嚏丝);
炉啊艾_函 int 炉啊丝_相等长串 (嚏串 *啊, 嚏串 *哔);
炉啊艾_函 void 炉啊丝_保留大小 (炉啊_国 *嘞, int 新大小);
炉啊艾_函 void 炉啊丝_清除缓存 (全局_国 *哥);
炉啊艾_函 void 炉啊丝_初始 (炉啊_国 *嘞);
炉啊艾_函 void 炉啊丝_移除 (炉啊_国 *嘞, 嚏串 *嚏丝);
炉啊艾_函 由数据 *炉啊丝_新由数据 (炉啊_国 *嘞, size_t 丝, int 恩由值);
炉啊艾_函 嚏串 *炉啊丝_新嘞串 (炉啊_国 *嘞, const char *串, size_t 嘞);
炉啊艾_函 嚏串 *炉啊丝_新 (炉啊_国 *嘞, const char *串);
炉啊艾_函 嚏串 *炉啊丝_创建长串对象 (炉啊_国 *嘞, size_t 嘞);

#endif